package com.ruoyi.model.service.impl;

import java.util.List;
import com.ruoyi.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import com.ruoyi.common.utils.StringUtils;
import org.springframework.transaction.annotation.Transactional;
import com.ruoyi.model.domain.Model;
import com.ruoyi.model.mapper.TrainTaskMapper;
import com.ruoyi.model.domain.TrainTask;
import com.ruoyi.model.service.ITrainTaskService;

/**
 * 模型训练任务Service业务层处理
 * 
 * @author ruoyi
 * @date 2025-03-10
 */
@Service
public class TrainTaskServiceImpl implements ITrainTaskService {
    @Autowired
    private TrainTaskMapper trainTaskMapper;

    /**
     * 查询模型训练任务
     * 
     * @param id 模型训练任务主键
     * @return 模型训练任务
     */
    @Override
    public TrainTask selectTrainTaskById(Long id) {
        return trainTaskMapper.selectTrainTaskById(id);
    }

    /**
     * 查询模型训练任务列表
     * 
     * @param trainTask 模型训练任务
     * @return 模型训练任务
     */
    @Override
    public List<TrainTask> selectTrainTaskList(TrainTask trainTask) {
        return trainTaskMapper.selectTrainTaskList(trainTask);
    }

    /**
     * 新增模型训练任务
     * 
     * @param trainTask 模型训练任务
     * @return 结果
     */
    @Transactional
    @Override
    public int insertTrainTask(TrainTask trainTask) {
        trainTask.setCreateTime(DateUtils.getNowDate());
        trainTask.setStatus("pending");
        int rows = trainTaskMapper.insertTrainTask(trainTask);
        insertModel(trainTask);
        return rows;
    }

    /**
     * 修改模型训练任务
     * 
     * @param trainTask 模型训练任务
     * @return 结果
     */
    @Transactional
    @Override
    public int updateTrainTask(TrainTask trainTask) {
        trainTask.setUpdateTime(DateUtils.getNowDate());
        trainTaskMapper.deleteModelById(trainTask.getId());
        insertModel(trainTask);
        return trainTaskMapper.updateTrainTask(trainTask);
    }

    /**
     * 批量删除模型训练任务
     * 
     * @param ids 需要删除的模型训练任务主键
     * @return 结果
     */
    @Transactional
    @Override
    public int deleteTrainTaskByIds(Long[] ids) {
        trainTaskMapper.deleteModelByIds(ids);
        return trainTaskMapper.deleteTrainTaskByIds(ids);
    }

    /**
     * 删除模型训练任务信息
     * 
     * @param id 模型训练任务主键
     * @return 结果
     */
    @Transactional
    @Override
    public int deleteTrainTaskById(Long id) {
        trainTaskMapper.deleteModelById(id);
        return trainTaskMapper.deleteTrainTaskById(id);
    }

    /**
     * 新增模型信息
     * 
     * @param trainTask 模型训练任务对象
     */
    public void insertModel(TrainTask trainTask) {
        List<Model> modelList = trainTask.getModelList();
        Long id = trainTask.getId();
        if (StringUtils.isNotNull(modelList)) {
            List<Model> list = new ArrayList<Model>();
            for (Model model : modelList) {
                model.setId(id);
                list.add(model);
            }
            if (list.size() > 0) {
                trainTaskMapper.batchModel(list);
            }
        }
    }

    /**
     * 开始训练任务
     * 
     * @param id 训练任务ID
     * @return 结果
     */
    @Override
    public int startTraining(Long id) {
        TrainTask task = new TrainTask();
        task.setId(id);
        task.setStatus("running");
        task.setStartTime(DateUtils.getNowDate());
        return trainTaskMapper.updateTrainTask(task);
    }

    /**
     * 停止训练任务
     * 
     * @param id 训练任务ID
     * @return 结果
     */
    @Override
    public int stopTraining(Long id) {
        TrainTask task = new TrainTask();
        task.setId(id);
        task.setStatus("failed");
        task.setEndTime(DateUtils.getNowDate());
        task.setErrorMsg("训练被手动停止");
        return trainTaskMapper.updateTrainTask(task);
    }
}
